<?php
require_once 'BancoDeDados.php';
require_once 'Usuario.php';
require_once 'Endereco.php';
require_once 'Cmdo.php';
require_once 'OM.php';
require_once 'RM.php';
require_once 'TipoEspaco.php';
require_once 'Facilidade.php';
require_once 'FonteRecursos.php';
require_once 'EstadoEspaco.php';
class EspacoCultural {

    private $cod_espaco;
    private $nome;
    private $usuarios;
    private $om;
    private $rm;
    private $cmdo;
    private $endereco;
    private $telefone;
    private $email;
    private $tipo;
    private $area;
    private $facilidades;
    private $fontes_recursos;
    private $estado;
    private $bi;
    private $descricao;
    private $imagens;
    private $vinculado;

    public function &getCod_espaco() {
        return $this->cod_espaco;
    }

    public function setCod_espaco(&$cod_espaco) {
        $this->cod_espaco = &$cod_espaco;
    }

    public function &getNome() {
        return $this->nome;
    }

    public function setNome(&$nome) {
        $this->nome = &$nome;
    }

    public function &getUsuarios() {
        return $this->usuarios;
    }

    public function setUsuarios(&$usuarios) {
        $this->usuarios = &$usuarios;
    }

    /**
     *
     * @return OM
     */
    public function &getOm() {
        return $this->om;
    }

    public function setOm(&$om) {
        $this->om = &$om;
    }

    /**
     *
     * @return RM
     */
    public function &getRm() {
        return $this->rm;
    }

    public function setRm(&$rm) {
        $this->rm = &$rm;
    }

    /**
     *
     * @return Cmdo
     */
    public function &getCmdo() {
        return $this->cmdo;
    }

    public function setCmdo(&$cmdo) {
        $this->cmdo = &$cmdo;
    }

    /**
     *
     * @return Endereco
     */
    public function &getEndereco() {
        return $this->endereco;
    }

    public function setEndereco(&$endereco) {
        $this->endereco = &$endereco;
    }

    public function &getTelefone() {
        return $this->telefone;
    }

    public function setTelefone(&$telefone) {
        $this->telefone = &$telefone;
    }

    public function &getEmail() {
        return $this->email;
    }

    public function setEmail(&$email) {
        $this->email = &$email;
    }

    /**
     *
     * @return TipoEspaco
     */
    public function &getTipo() {
        return $this->tipo;
    }

    public function setTipo(&$tipo) {
        $this->tipo = &$tipo;
    }

    public function &getArea() {
        return $this->area;
    }

    public function setArea(&$area) {
        $this->area = &$area;
    }

    public function &getFacilidades() {
        return $this->facilidades;
    }

    public function setFacilidades(&$facilidades) {
        $this->facilidades = &$facilidades;
    }

    public function &getFontes_recursos() {
        return $this->fontes_recursos;
    }

    public function setFontes_recursos(&$fonte_recursos) {
        $this->fontes_recursos = &$fonte_recursos;
    }

    /**
     *
     * @return EstadoEspaco
     */
    public function &getEstado() {
        return $this->estado;
    }

    public function setEstado(&$estado) {
        $this->estado = &$estado;
    }

    public function &getBi() {
        return $this->bi;
    }

    public function setBi(&$bi) {
        $this->bi = &$bi;
    }

    public function &getDescricao() {
        return $this->descricao;
    }

    public function setDescricao(&$descricao) {
        $this->descricao = &$descricao;
    }

    public function &getImagens() {
        return $this->imagens;
    }

    public function setImagens(&$imagens) {
        $this->imagens = &$imagens;
    }

    public function &isVinculado() {
        return $this->vinculado;
    }

    private function setVinculado(&$vinculado) {
        $this->vinculado = &$vinculado;
    }
    
    public function cadastrar() {
        if ($this->validar() != 1) {
            throw new Exception("Espaço Cultural existente");
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into espaco (nome, cod_om, cod_rm, cod_cmdo, cod_endereco, telefone, email, cod_tipo, area, fonte_recursos, cod_estado_espaco, bi, descricao) values(?,?,?,?,?,?,?,?,?,?,?,?,?)');
        $result = $link->execute($stmt, array($this->nome, $this->om->getCod_om(), $this->rm->getCod_rm(), $this->cmdo->getCod_cmdo(), $this->endereco->getCod_endereco(), $this->telefone, $this->email, $this->tipo->getCod_tipo(), $this->area, $this->estado->getCod_estado_espaco(), $this->bi, $this->descricao));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $result = $banco->getLink()->query('select cod_espaco from espaco where nome = ?', array($this->nome));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $result->fetchInto($row);
        $this->cod_espaco = &$row['cod_espaco'];
        $link->commit();
    }

    public function alterar() {
        if ($this->validar() != 1) {
            throw new Exception("Espaço Cultural existente");
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update espaco set nome = ?, cod_om = ?, cod_rm = ?, cod_cmdo = ?, telefone = ?, email = ?, cod_tipo = ?, area = ?, fonte_recursos = ?, cod_estado_espaco = ?, bi = ?, descricao = ? where cod_espaco = ?');
        $result = $link->execute($stmt, array($this->nome, $this->om->getCod_om(), $this->rm->getCod_rm(), $this->cmdo->getCod_cmdo(), $this->telefone, $this->email, $this->tipo->getCod_tipo(), $this->area, $this->fontes_recursos, $this->estado->getCod_estado_espaco(), $this->bi, $this->descricao, $this->cod_espaco));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from espaco where cod_espaco = ?');
        $result = $link->execute($stmt, array($this->cod_espaco));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public static function listar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select espaco.cod_espaco, nome from espaco order by nome');
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $espaco = new EspacoCultural();
            $espaco->setCod_espaco($row['cod_espaco']);
            $espaco->setNome($row['nome']);
            $resultado[] = &$espaco;
            unset($espaco);
        }
        return $resultado;
    }

    public static function listarPorUsuario(&$cod_usuario) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('SELECT espaco.cod_espaco, nome FROM espaco, usuario_espaco WHERE espaco.cod_espaco = usuario_espaco.cod_espaco and usuario_espaco.cod_usuario = ?', array($cod_usuario));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $espaco = new EspacoCultural();
            $espaco->setCod_espaco($row['cod_espaco']);
            $espaco->setNome($row['nome']);
            $resultado[$row['cod_espaco']] = &$espaco;
            unset($espaco);
        }
        return $resultado;
    }
    
    public static function consultar(&$cod_espaco) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from espaco where cod_espaco = ?', array($cod_espaco));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() == 0) {
            throw new Exception("Espaço Cultural inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de uma Espaço Cultural com o mesmo identificador, informar ao administrador");
        }
        $result->fetchInto($row);
        $espaco = new EspacoCultural();
        $espaco->setCod_espaco($row['cod_espaco']);
        $espaco->setArea($row['area']);
        $espaco->setBi($row['bi']);
        $espaco->setCmdo(Cmdo::consultar($row['cod_cmdo']));
        $espaco->setDescricao($row['descricao']);
        $espaco->setEmail($row['email']);
        $espaco->setEndereco(Endereco::consultar($row['cod_endereco']));
        $espaco->setEstado(EstadoEspaco::consultar($row['cod_estado_espaco']));
        $espaco->setFacilidades(Facilidade::listarPorEspaco($row['cod_espaco']));
        $espaco->setFontes_recursos(FonteRecursos::listarPorEspaco($row['cod_espaco']));
        //$espaco->setImagens($row['imagens']);
        $espaco->setNome($row['nome']);
        $espaco->setOm(OM::consultar($row['cod_om']));
        $espaco->setRm(RM::consultar($row['cod_rm']));
        $espaco->setTelefone($row['telefone']);
        $espaco->setTipo(TipoEspaco::consultar($row['cod_tipo']));
        //$espaco->setUsuarios(Usuario::listarPorEspaco($row['cod_espaco']));
        $espaco->setVinculado($this->verificarVinculacao());
        return $espaco;
    }

    public static function consultarPorObjeto(&$cod_interno) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select espaco.cod_espaco, nome from espaco, objeto where espaco.cod_espaco = objeto.cod_espaco and cod_interno = ?', array($cod_interno));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() == 0) {
            throw new Exception("Espaço Cultural inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de uma Espaço Cultural com o mesmo identificador, informar ao administrador");
        }
        $result->fetchInto($row);
        $espaco = new EspacoCultural();
        $espaco->setCod_espaco($row['cod_espaco']);
        $espaco->setNome($row['nome']);
        return $espaco;
    }

    private function validar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_espaco from espaco where nome = ?', array($this->nome));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() > 0) {
            return 0;
        }
        return 1;
    }
    
    private function verificarVinculacao() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('SELECT espaco.cod_espaco FROM espaco, usuario_espaco, objeto WHERE espaco.cod_espaco = ? AND (espaco.cod_espaco = usuario_espaco.cod_espaco OR  objeto.cod_espaco = espaco.cod_espaco)', array($this->cod_espaco));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() > 0) {
            return 1;
        }
        return 0;
    }

    public function cadastrarUsuario(Usuario &$usuario) {
        if (!$this->usuarios[$usuario->getCod_usuario()] instanceof Usuario) {
            $usuario->cadastrarEspaco($this);
            $this->usuarios[$usuario->getCod_usuario()] = &$usuario;
        }
    }

    public function excluirUsuario(&$cod_usuario) {
        if ($this->usuarios[$cod_usuario] instanceof Usuario) {
            $this->usuarios[$cod_usuario]->excluirEspaco($this->cod_espaco);
            unset($this->usuarios[$cod_usuario]);
        }
    }

    public function cadastrarFacilidade(Facilidade &$facilidade) {
        if (!$this->facilidades[$facilidade->getCod_facilidade()] instanceof Facilidade) {
            $facilidade->setEspaco($this);
            $facilidade->cadastrarParecer();
            $this->facilidades[$facilidade->getCod_facilidade()] = &$facilidade;
        }
    }

    public function alterarFacilidade(&$parecer, &$cod_facilidade) {
        if ($this->facilidades[$cod_facilidade] instanceof Facilidade) {
            $facilidade = $this->facilidades[$cod_facilidade];
            $facilidade->setParecer($parecer);
            $facilidade->alterarParecer();
            $this->facilidades[$cod_facilidade] = &$facilidade;
        }
    }

    public function excluirFacilidade(&$cod_facilidade) {
        if ($this->facilidades[$cod_facilidade] instanceof Facilidade) {
            $this->facilidades[$cod_facilidade]->excluirParecer();
            unset($this->facilidades[$cod_facilidade]);
        }
    }

    public function cadastrarFonteRecursos(FonteRecursos &$fonte_recursos) {
        if (!$this->fontes_recursos[$fonte_recursos->getCod_fonte_recursos()] instanceof FonteRecursos) {
            $fonte_recursos->setEspaco($this);
            $fonte_recursos->cadastrarParecer();
            $this->fontes_recursos[$fonte_recursos->getCod_fonte_recursos()] = &$fonte_recursos;
        }
    }

    public function alterarFonteRecursos(&$valor, &$cod_fonte_recursos) {
        if ($this->fontes_recursos[$cod_fonte_recursos] instanceof FonteRecursos) {
            $fonte_recursos = $this->fontes_recursos[$cod_fonte_recursos];
            $fonte_recursos->setValor($valor);
            $fonte_recursos->alterarValor();
            $this->fontes_recursos[$cod_fonte_recursos] = &$fonte_recursos;
        }
    }

    public function excluirFonteRecursos(&$cod_fonte_recursos) {
        if ($this->fontes_recursos[$cod_fonte_recursos] instanceof FonteRecursos) {
            $this->fontes_recursos[$cod_fonte_recursos]->excluirParecer();
            unset($this->fontes_recursos[$cod_fonte_recursos]);
        }
    }
    
    public function validarCod_registro(&$cod_registro) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_interno from objeto, espaco where objeto.cod_espaco = espaco.cod_espaco and objeto.cod_registro = ? and espaco.cod_espaco = ?', array($cod_registro, $this->cod_espaco));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() > 0) {
            return false;
        }
        return true;
    }
}
?>